iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0
JavaScript

不要再說你不會後端!30 天 Node.js 降維打擊指南 系列 第 4 篇

Day 4:內建核心模組實戰(fs, path, http)

  • 分享至 

  • xImage
  •  

在昨天的非同步挑戰中,我們見識了 Event Loop 的威力。今天,我們要來認識 Node.js 的「軍火庫」——內建核心模組 (Core Modules)。

Node.js 之所以強大,是因為它不需要額外下載第三方套件,就自帶了處理檔案、路徑、甚至是建立 Web 伺服器的能力。我們將聚焦實戰中最常用的三個核心模組:path、fs 與 http。


1. path 模組:解決跨平台路徑大戰

在後端開發中,處理檔案路徑是一個常見的痛點。Windows 系統的路徑是用反斜線(如 C:\Users\Desktop),而 Mac/Linux 是用正斜線(如 /Users/Desktop)。如果把路徑寫死,你的程式換一台電腦就會當機。

path 模組就是用來解決這個問題的。

實作練習:
在 hello-node 資料夾下,新增一個 server.js,輸入以下程式碼:

import path from 'path';

// 取得目前的檔案所在資料夾路徑
// 注意:這是 Node.js v20.11 以上在 ESM 模式下的專屬寫法!
const currentDir = import.meta.dirname;

// 使用 path.join 安全地組合路徑
const dataPath = path.join(currentDir, 'config', 'settings.json');

console.log("目前的資料夾:", currentDir);
console.log("組合後的安全路徑:", dataPath);

執行 node server.js。你會發現 path.join() 自動幫你依據目前的作業系統,拼湊出最完美的斜線方向。
image


2. fs 模組:檔案系統的進階操作

昨天我們用 fs/promises 讀寫了檔案,今天來看看如何「操作資料夾」。在實務上,我們常需要讀取某個資料夾底下有哪些檔案。

實作練習:
繼續在 server.js 往下加入這段程式碼:

import { readdir } from 'fs/promises';

const checkDirectory = async () => {
    try {
        // 讀取目前資料夾 (import.meta.dirname) 底下的所有檔案與資料夾
        const files = await readdir(import.meta.dirname);
        console.log(" 本資料夾內容:", files);
    } catch (error) {
        console.error("讀取失敗", error);
    }
};

checkDirectory();

執行後,你會看到終端機印出一個陣列,裡面包含了 app.js、math.js、package.json 等你這幾天建立的所有檔案。


image

image

3. http 模組:純手工打造第一台 Web 伺服器

這是今天的主菜,也是所有後端框架(包含我們未來要學的 Express)的底層核心。我們將完全不靠任何外部套件,純手工起一個伺服器,讓瀏覽器能夠連線過來!

實作練習:
將 server.js 的內容全部清空,換成以下這段經典的 HTTP 伺服器程式碼:

import http from 'http';

// 建立伺服器,req (Request) 是客戶端發來的請求,res (Response) 是我們要回傳的回應
const server = http.createServer((req, res) => {
    
    // 取得使用者請求的網址路徑
    console.log(`收到請求:${req.method} ${req.url}`);

    // 簡易路由設計
    if (req.url === '/') {
        // 回傳 HTML 格式
        res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
        res.end('<h1> 歡迎來到戰錘40k,我是爺們</h1>');
        
    } else if (req.url === '/api/user') {
        // 回傳 JSON 格式 (現代 API 最常用的格式)
        const userData = { name: 'Node Master', level: 99 };
        res.writeHead(200, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify(userData));
        
    } else {
        // 找不到頁面,回傳 404 狀態碼
        res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
        res.end('404 Not Found - 找不到這個酷東西');
    }
});

// 指定伺服器監聽 3000 埠 (Port)
const PORT = 3000;
server.listen(PORT, () => {
    console.log(` 伺服器已啟動,請打開瀏覽器前往:http://localhost:${PORT}`);
    console.log(`試著訪問 http://localhost:${PORT}/api/user 看看 JSON 回應!`);
});

驗證你的心血結晶:

  1. 執行 node server.js,這次終端機不會立刻結束,而是會停留在 伺服器已啟動...,這代表你的程式正在持續監聽連線!
    image

  2. 打開你的網頁瀏覽器(Chrome 或 Edge)。

  3. 在網址列輸入 http://localhost:3000 並按下 Enter。你將會看到大大的「 歡迎來到純手工 Node.js 伺服器!」。
    image

  4. 接著輸入 http://localhost:3000/api/user,你會看到完美的 JSON 格式資料被印在畫面上。
    image

  5. (要關閉伺服器時,請在終端機按下 Ctrl + C)。

你現在已經具備了撰寫 Web API 的最底層概念:接收請求 (req) ➔ 判斷路徑 ➔ 設定標頭與狀態碼 (res.writeHead) ➔ 回傳資料 (res.end)。


上一篇
Day 3:非同步編程的降維打擊(Event Loop 與 async/await)
下一篇
Day 5:Stream 與 Buffer 的記憶體防禦戰
系列文
不要再說你不會後端!30 天 Node.js 降維打擊指南 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言